home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / PROGNG_C / DBTOOLC.LZH / SOURCE.ARC / DCTMAIN.H < prev    next >
C/C++ Source or Header  |  1987-04-12  |  10KB  |  305 lines

  1. /* ----------------------------------------------------------------
  2.  
  3.     NAME: 
  4.         dctmain.h - main #include file for c tools
  5.             
  6.     SYNOPSIS:
  7.         #include "dctmain.h"
  8.  
  9.     DESCRIPTION:
  10.         Contains many global variables, defines, and typedefs
  11.         for use by all c tools.
  12.     
  13.     NOTES:
  14.         c_catch.c ONLY should define the variable C_CTCH_MAIN!
  15.  
  16.     AUTHOR: J. A. Bortz/J. T. Cooper
  17.  
  18.     Copyright (C) 1985, J. T. Cooper & Co., ALL RIGHTS RESERVED
  19.  ---------------------------------------------------------------- */
  20.  
  21. #ifdef AZTEC
  22. #include "math.h"
  23. double  atof();
  24. long    atol();
  25. #else
  26. #include <dos.h>
  27. #include <math.h>
  28. #endif
  29.  
  30. #ifdef LC2  /* version 2.15 has no void type */
  31. #define void int
  32. #endif
  33.  
  34. #ifdef MS   /* version 3.0 doesn't like pointers to void functions */
  35. #define void int    /* so we cheat */
  36. #endif
  37.  
  38. #ifdef LATTICE
  39. extern long sizmem();
  40. #endif
  41.  
  42. #ifndef LATTICE     /* only Lattice has sizmem for status */
  43. #define dctalloc(a,b)   calloc(a,b)
  44. extern char *calloc();
  45. #else
  46. extern  char *dctalloc(), *calloc();
  47. #endif
  48.  
  49. char *db_GetParm();
  50. #define GetFunc(a,b)    db_GetParm(a, b, ' ')
  51. #define GetNext(a,b)    db_GetParm(a, b, ',')
  52. #define GetString(a,b)  db_GetParm(a, b, 'S')
  53.  
  54. unsigned Offset(), Segment();
  55.  
  56.  
  57. /************************************************************************
  58.             Common "C" Defines
  59.  ************************************************************************/
  60.  
  61. #define Local static
  62. #define Register
  63. #define SPACE ' '
  64.  
  65. #ifndef min
  66. #define min(a,b) ((a)<=(b)?(a):(b))
  67. #endif
  68.  
  69. /************************************************************************
  70.                 Global Variables
  71.  ************************************************************************/
  72.  
  73.  
  74. /* ------------------------------------------------------------------------
  75. The follow code sets up the global variables used to hold the two
  76. machine-context stack frames.  They are declared int if CT_CTCH_MAIN
  77. is defined, or external otherwise.
  78. The DS register is stored in an interrupt vector location because
  79. when doing a FAR access, the DS register must be set correctly so it can
  80. retrieve the address necessary to retrieve itself!  By storing it in an
  81. interrupt vector, we know its offset via the vecno, and its segment is
  82. 0000 by default.  We define macros to make this transparent.
  83. ------------------------------------------------------------------------ */
  84.  
  85. #ifndef C_CTCH_MAIN         
  86. #define C_CT_EXTERN extern
  87. #else
  88. #define C_CT_EXTERN 
  89. #endif
  90.  
  91. C_CT_EXTERN int     Res_Mem;    /* amount of memory (in KB) to reserve */
  92. C_CT_EXTERN long    Prog_Size;  /* approx size of this program in bytes */
  93.  
  94. C_CT_EXTERN
  95. int Our_Ds;     /* DataSeg of the Resident Library */
  96.  
  97.  
  98. C_CT_EXTERN
  99. int DB_SETFLAG, /* if ON (1), next call to dispatch will enable */
  100.             /* assignment and recollection of dbase memvars */
  101.  
  102.     DB_VARTYPE, /* used to keep type of variable */
  103.     DB_VARVAL,  /* used to return memory variables */
  104.     DB_bx,
  105.     DB_C_VAR,   /* holds address of character variable contents */
  106.     DB_C_bx,    /* keeps bx for character variable */
  107.     DB_D_VAR,   /* holds address of date variable contents */
  108.     DB_D_bx,    /* keeps bx for date variable */
  109.     DB_L_VAR,   /* holds address of logical variable contents */
  110.     DB_L_bx,    /* keeps bx for logical variables */
  111.     DB_N_VAR,   /* holds address of numeric variable contents */
  112.     DB_N_bx,    /* keeps bx for numeric variables */
  113.     DB_S_VAR,   /* holds address for global status integer */
  114.     DB_S_bx,    /* keeps bx for status variable */
  115.     DB_E_VAR,   /* holds address for global error integer */
  116.     DB_E_bx;    /* keeps bx for error variable */
  117.  
  118.  
  119.  
  120. #ifdef C_CTCH_MAIN
  121. double DB_STATUS=0; /* actual status variable */
  122.  
  123. /* These variables are initialized, so that their segments are
  124.  * predictable from compiler to compiler, since they must be
  125.  * accessed from assembler functions
  126.  */
  127. /* This is the Stack Frame for the Application Program (dBASE) */
  128. int
  129.         sf1_bx=0,
  130.         sf1_sp=0,
  131.         sf1_ss=0,
  132. #define sf1_ds (peekw(BASE_INTERRUPT, 0))
  133.         sf1_es=0;
  134.  
  135. /* and this is the Stack Frame for the Resident Library (us) */
  136. int
  137.         sf2_sp=0,
  138.         sf2_ss=0,
  139.         sf2_es=0;
  140.  
  141. char    *errmsg[] = 
  142.             {
  143.             "", 
  144.             "Invalid Memory Type",
  145.             "No Such Function",
  146.             "That array is already in use",
  147.             "Too many array elements requested",
  148.             "No more arrays available",
  149.             "Insufficient memory",
  150.             "Invalid array name",
  151.             "Array offset is out of range",
  152.             "Attempt to free invalid block",
  153.             "That array is empty",
  154.             "Invalid calling syntax for this function",
  155.             "I/O Error"
  156.             };
  157. int DB_ERROR = 0;   /* actual error variable */
  158. int DB_ERRFLG = 1;  /* flag to report errors or not */
  159. int DB_BELLFLG = 1;    /* flag to ring bell during errors */
  160.  
  161. #else
  162. extern int  DB_ERROR;   /* actual error variable */
  163. extern int  DB_ERRFLG;  /* flag to report errors or not */
  164. extern int    DB_BELLFLG;    /* flag to ring bell during errors */
  165. extern int  
  166.         sf1_bx,
  167.         sf1_sp,
  168.         sf1_ss,
  169. #define sf1_ds (peekw(BASE_INTERRUPT, 0))
  170.         sf1_es;
  171.  
  172.  
  173. extern int  
  174.         sf2_sp,
  175.         sf2_ss,
  176.         sf2_es;
  177.  
  178. extern  double  DB_STATUS;
  179. extern  char    **errmsg;
  180.  
  181. #endif              
  182. C_CT_EXTERN char    *CFuncArgs; /* holds args from cfunc call */
  183. C_CT_EXTERN int        ArgCount;
  184. #define MAXARGS    10
  185. #define LONGARG 80
  186. C_CT_EXTERN char    ArgVal[MAXARGS][LONGARG];
  187.  
  188. #define MSG_INV_TYPE    1
  189. #define MSG_NO_FUNC     2
  190. #define MSG_IN_USE      3
  191. #define MSG_TOO_MANY    4
  192. #define MSG_NO_MORE     5
  193. #define MSG_NO_SPACE    6
  194. #define MSG_NO_ARRAY    7
  195. #define MSG_OUT_OF_BOUNDS   8
  196. #define MSG_BAD_BLK     9
  197. #define MSG_EMPTY       10
  198. #define INV_CALL    11      /* invalid calling syntax */
  199. #define MSG_IO_ERROR    12
  200.  
  201.  
  202. extern unsigned ci_initint(), ci_callfunc();
  203.  
  204.  
  205.  
  206.  
  207. /************************************************************************
  208.                 CATCHINT Defines
  209.  ************************************************************************/
  210.  
  211.  
  212. #define CNAMELEN    32  /* C identifiers can be 32 chars */
  213. #define INTRPT1     69  /* Primary interrupt location */
  214. #define INTRPT2     70  /* 2nd interrupt location for temp storage */
  215. #define BASE_INTERRUPT  (INTRPT2*4)
  216. #define INT_MEM_RESERVE (1024*4)  /* Memory reserved for internal use */
  217. #define ALLOC_OVHD  (1024+8)    /* overhead for internal calloc()'s */
  218.  
  219. /* codes for return type */
  220.  
  221. #define CHARTYPE    0
  222. #define INTTYPE     1
  223. #define LONGTYPE    2
  224. #define DOUBLETYPE  3
  225. #define FLOATTYPE   4
  226.  
  227. /************************************************************************
  228.             Common Structure Definitions
  229.  ************************************************************************/
  230.  
  231.  
  232. /* ------------------------------------------------------------------------
  233.             Catchint Dispatch Table
  234.    Holds information necessary to invoke function based on its name 
  235. ------------------------------------------------------------------------ */
  236.  
  237. struct ci_DT
  238.     {
  239.     char    F_Name[CNAMELEN];   /* Name of C function  */
  240.     void    (*F_Ptr)();     /* Pointer to Function */
  241.     char    F_Descr[72];    /* Description of function */
  242.     };
  243.  
  244. #ifdef AZTEC
  245.  
  246. /* ------------------------------------------------------------------------
  247.         8086 register definitions for Aztec compiler
  248. ** ------------------------------------------------------------------------ */
  249.  
  250. struct regs
  251.     {
  252.     int     ax;
  253.     int     bx;
  254.     int     cx;
  255.     int     dx;
  256.     int     si;
  257.     int     di;
  258.     int     ds;
  259.     int     es;
  260.     };
  261.  
  262. #endif
  263.     
  264.  
  265. /************************************************************************
  266.         dBase Memory Variable Accessing Macros
  267.  ************************************************************************/
  268.  
  269. #ifdef LATTICE
  270.  
  271. #define SetStatus(val)  poke(DB_S_VAR, DB_S_bx, (char *)&val, 8)
  272. #define SetSRet(val)    poke(DB_S_VAR, DB_S_bx, (char *)&val, 8)
  273. #define SetNRet(val)    poke(DB_N_VAR, DB_N_bx, (char *)&val, 8)
  274. #define SetCRet(val)    poke(DB_C_VAR, DB_C_bx, val, strlen(val))
  275. #define SetDRet(val)    poke(DB_D_VAR, DB_D_bx, (char *)&val, 8)
  276. #define SetLRet(val)    poke(DB_L_VAR, DB_L_bx, (char *)&val, 1)
  277. #define SetERet(val)    poke(DB_E_VAR, DB_E_bx, (char *)&val, 8)
  278.  
  279. #endif /* LATTICE */
  280.  
  281. #ifdef AZTEC        /* +AZTEC+ */
  282.         
  283. #define SetStatus(val)  movblock(&val, Our_Ds, DB_S_bx, DB_S_VAR, 8)
  284. #define SetSRet(val)    movblock(&val, Our_Ds, DB_S_bx, DB_S_VAR, 8)
  285. #define SetNRet(val)    movblock(&val, Our_Ds, DB_N_bx, DB_N_VAR, 8)
  286. #define SetCRet(val)    movblock(val, Our_Ds, DB_C_bx, DB_C_VAR, strlen(val))
  287. #define SetDRet(val)    movblock(&val, Our_Ds,DB_D_bx, DB_D_VAR, 8)
  288. #define SetLRet(val)    movblock(&val, Our_Ds,DB_L_bx, DB_L_VAR, 1)
  289. #define SetERet(val)    movblock(&val, Our_Ds, DB_E_bx, DB_E_VAR, 8)
  290. #endif /* AZTEC */
  291.  
  292. #ifdef MS
  293. /* microsoft uses custom version of poke (in c_catch.c) */
  294.  
  295. #define SetStatus(val)  poke(DB_S_VAR, DB_S_bx, &val, 8)
  296. #define SetSRet(val)    poke(DB_S_VAR, DB_S_bx, &val, 8)
  297. #define SetNRet(val)    poke(DB_N_VAR, DB_N_bx, &val, 8)
  298. #define SetCRet(val)    poke(DB_C_VAR, DB_C_bx, val, strlen(val))
  299. #define SetDRet(val)    poke(DB_D_VAR, DB_D_bx, &val, 8)
  300. #define SetLRet(val)    poke(DB_L_VAR, DB_L_bx, &val, 1)
  301. #define SetERet(val)    poke(DB_E_VAR, DB_E_bx, &val, 8)
  302.  
  303. #endif /* Microsoft */
  304.  
  305.